package com.learnjdk.pr;

import org.junit.Test;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * Stream加强
 * Stream是java8中的新特性，java9开始对Stream增加了以下四个新方法。
 */
public class StreamPlusLearn {

    public static void main(String[] args) {
//        //1.增加单个参数构造方法，可为null.
//        long count = Stream.ofNullable(null).count();//0
//
//        //2.增加takeWhile和dropWhile方法
//        List<Integer> collect = Stream.of(1, 2, 3, 2, 1)
//                .takeWhile(n -> n < 3)
//                .collect(Collectors.toList());
//
//        collect.forEach(System.out::println);

        //从开始计算，当n<3时就截止
        List<Integer> collect1 = Stream.of(1, 2, 3, 2, 1)
                .dropWhile(n -> n < 3)
                .collect(Collectors.toList());

        collect1.forEach(System.out::println);


        /**
         * 3.iterate重载
         * 这个iterate方法的新重载方法，可以让你提供一个Predicate(判断条件)来指定什么时候结束迭代。
         */
    }

    @Test
    public void test1() {
        Stream<Integer> integerStream = Stream.of(3, 9, 20, 22, 40);
        integerStream.forEach((var s) -> System.out.println(s));
        integerStream.forEach(System.out::println);

        System.out.println("*********************************");

        //流中没有数据
        Stream<Object> objectStream = Stream.of();
        objectStream.forEach(System.out::println);

        System.out.println("**********************************");

        //传入null会被解析为一个数组对象，会进一步访问它的长度信息
        Stream<Object> stream3 = Stream.ofNullable(null);
        stream3.forEach(System.out::println);

        //可以传入一个null来创建对象
        Stream<Object> streamTest3 = Stream.ofNullable(null);
        streamTest3.forEach(System.out::println);

        //可以传入一个null来创建流对象
        Stream<Object> stream = Stream.ofNullable(null);
        stream.forEach(System.out::println);

    }


    @Test
    public void test2() {
        Stream<Integer> stream1 = Stream.of(3, 9, 20, 22, 40, 7);
        //新方法, talkWhile,dropWhile
        //从流中一直获取判定器为真的元素，一旦遇到元素为假，就终止处理。
        Stream<Integer> stream2 = stream1.takeWhile(t -> t % 2 != 0);
        stream2.forEach(System.out::println);

        System.out.println("****************************");

        Stream<Integer> integerStream = Stream.of(3, 9, 20, 22, 40, 7);
        //去除所有元素为真的
        Stream<Integer> dropWhile = integerStream.dropWhile(t -> t % 2 != 0);
        dropWhile.forEach(System.out::println);
    }

    @Test
    public void test3() {
        //流的迭代，创建流
        Stream<Integer> integerStream = Stream.iterate(2, t -> (2 * t) + 1);
        integerStream.limit(10).forEach(System.out::println);

        System.out.println("******************");
        //有限的迭代
        Stream<Integer> integerStream1 = Stream.iterate(1, t -> t < 1000, t -> (2 * t) + 1);
        integerStream1.forEach(System.out::println);

    }


}
